package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.MunicipioDAO;
import mx.ipn.persistencia.dao.ColoniaDAO;
import mx.ipn.to.MunicipioTO;
import mx.ipn.to.ColoniaTO;

public class ColoniaDAOMySQL implements ColoniaDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(ColoniaDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO colonia (nombre,id_municipio,codigo_postal) VALUES(?,?,?)";
	private static final String DELETE = "DELETE FROM colonia WHERE id_colonia=?";
	private static final String UPDATE = "UPDATE colonia SET nombre=?,id_municipio=?,codigo_postal=? WHERE id_colonia=?";

	private static final String FINDBYID = "SELECT * FROM colonia WHERE id_colonia=?";
	private static final String FINDBYNOMBREMUNICIPIO = "SELECT * FROM colonia WHERE nombre=? and id_municipio=?";
	private static final String SELECT = "SELECT * FROM colonia";
	private static final String SELECTBYMUNICIPIO = "SELECT * FROM colonia WHERE id_municipio=?";
	FabricaDeDAOs fabricaMySQL;

	public boolean insertColonia(ColoniaTO coloniaTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setString(1, coloniaTO.getNombre());
			ps.setInt(2, coloniaTO.getMunicipioTO().getIdMunicipio());
			ps.setString(3, coloniaTO.getCodigoPostal());
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	public short deleteColonia(int idColonia) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DELETE);

			ps.setInt(1, idColonia);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	public short updateColonia(ColoniaTO coloniaTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setString(1, coloniaTO.getNombre());
			ps.setInt(2, coloniaTO.getMunicipioTO().getIdMunicipio());
			ps.setString(3, coloniaTO.getCodigoPostal());
			ps.setInt(4, coloniaTO.getIdColonia());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	public ColoniaTO findColoniaById(int idcolonia) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idcolonia);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			MunicipioDAO edo = fabricaMySQL.getMunicipioDAO();
			if (rs.next()) {
				idcolonia = rs.getInt("id_colonia");
				String nombre = rs.getString("nombre");
				MunicipioTO mun = edo.findMunicipioById(rs
						.getInt("id_municipio"));
				String cp = rs.getString("codigo_postal");
				ColoniaTO ColoniaTO = new ColoniaTO(idcolonia, nombre, mun, cp);

				ps.close();
				conexion.close();
				return ColoniaTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public ColoniaTO findColoniaByNombreMunicipio(String nombre, int idMunicipio) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(FINDBYNOMBREMUNICIPIO);
			ps.setString(1, nombre);
			ps.setInt(2, idMunicipio);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			MunicipioDAO edo = fabricaMySQL.getMunicipioDAO();
			if (rs.next()) {
				int idcolonia = rs.getShort("id_colonia");
				nombre = rs.getString("nombre");
				MunicipioTO mun = edo.findMunicipioById(rs
						.getShort("id_municipio"));
				String cp = rs.getString("codigo_postal");
				ColoniaTO ColoniaTO = new ColoniaTO(idcolonia, nombre, mun, cp);

				ps.close();
				conexion.close();
				return ColoniaTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public ArrayList<ColoniaTO> selectColonia() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			MunicipioDAO edo = fabricaMySQL.getMunicipioDAO();
			ArrayList<ColoniaTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<ColoniaTO>();
				int idcolonia = rs.getInt("id_colonia");
				String nombre = rs.getString("nombre");
				MunicipioTO mun = edo.findMunicipioById(rs
						.getInt("id_municipio"));
				String cp = rs.getString("codigo_postal");
				ColoniaTO ColoniaTO = new ColoniaTO(idcolonia, nombre, mun, cp);
				coleccion.add(ColoniaTO);
			}

			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ColoniaTO selectColoniaByMunicipio(int idMunicipio) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			MunicipioDAO municipioDAO = null;

			ArrayList<Integer> listIdColonia = null;
			ArrayList<String> listNombre = null;
			ArrayList<String> listCodigoPostal = null;

			ColoniaTO coloniaTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYMUNICIPIO);
			ps.setInt(1, idMunicipio);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdColonia == null) {

					listIdColonia = new ArrayList<Integer>();
					listNombre = new ArrayList<String>();
					listCodigoPostal = new ArrayList<String>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					municipioDAO = fabricaMySQL.getMunicipioDAO();
				}

				listIdColonia.add(rs.getInt("id_colonia"));
				listNombre.add(rs.getString("nombre"));
				listCodigoPostal.add(rs.getString("codigo_postal"));

			}
			if (listIdColonia != null) {
				Integer[] arrIdColonia = (Integer[])listIdColonia.toArray(new Integer[listIdColonia.size()]);
				String[] arrNombre = (String[])listNombre.toArray(new String[listNombre.size()]);
				String[] arrCodigoPostal = (String[])listCodigoPostal.toArray(new String[listCodigoPostal.size()]);

				coloniaTO = new ColoniaTO(arrIdColonia, arrNombre,
						arrCodigoPostal, municipioDAO.findMunicipioById(idMunicipio));
			}
			ps.close();
			conexion.close();
			return coloniaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
}
